/**
 @file socket_interface.h
 @brief Funciones para el manejo de sockets del servicio de intercambio de mensajes.
 @date   06/12/2012
 @version v.0.9
 @author Julian Ovalle
 julianovalle@ula.ve
 */

#ifndef SOCKET_INTERFACE_H_
#define SOCKET_INTERFACE_H_

#include <sys/types.h>
#include <sys/socket.h>

//#define SOCK_INTERFACE_DEBUG

/*!
 @brief Crea y conecta el socket hacia el servicio de intercambio de mensajes.
 @return Descriptor del socket conectado. -1 en caso de error.
 */
int openSocket();

/*!
   @brief Envia el contenido de *data a través del socket dado.
   @param sfd descriptor del socket.
   @param *data Apuntador a la data a enviar.
   @param size tamaño de la data a enviar.
   @param *addr contenedor de la dirección de destino.
   @param addrlen tamaño del contenedor de la dirección de destino.
   @param timeout_s tiempo máximo de espera en segundos.
   @param timeout_ms tiempo máximo de espera en milisegundos.
   @return 0 en caso de exito. -1 en caso de error.
   @see openSocket()
 */
int socketSend (int sfd, const void* data, size_t size, struct sockaddr* addr, socklen_t addrlen, int timeout_s, int timeout_ms);

/*!
   @brief Almacena en *data los size bytes recibidos desde el socket dado.
   @param sfd descriptor del socket.
   @param *buf Apuntador a la data recibida.
   @param size tamaño de la data a recibir.
   @param *addr contenedor de la dirección de origen.
   @param addrlen tamaño del contenedor de la dirección de origen.
   @param timeout_s tiempo máximo de espera en segundos.
   @param timeout_ms tiempo máximo de espera en milisegundos.
   @return 0 en caso de exito. -1 en caso de error.
   @see openSocket()
 */
int socketReceive(int sfd, const void* buf, size_t size, struct sockaddr* addr, socklen_t addrlen, int timeout_s, int timeout_ms);

//@brief Vacía el buffer del socket mediante lecturas sucesivas.
void flushSocket (int s);

#endif /* SOCKET_INTERFACE_H_ */
